home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 10 / AACD 10.iso / AACD / Resources / Online / Term / Extras / Source / term-source.lha / PhonePanelPlus.c < prev    next >
C/C++ Source or Header  |  1996-10-20  |  13KB  |  591 lines

  1. /*
  2. **    PhonePanelPlus.c
  3. **
  4. **    The phonebook and support routines
  5. **
  6. **    Copyright © 1990-1996 by Olaf `Olsen' Barthel
  7. **        All Rights Reserved
  8. **
  9. **    :ts=4
  10. */
  11.  
  12. #ifndef _GLOBAL_H
  13. #include "Global.h"
  14. #endif
  15.  
  16.     /* The gadget IDs are in there */
  17.  
  18. #ifndef _PHONEPANEL_H
  19. #include "PhonePanel.h"
  20. #endif    /* _PHONEPANEL_H */
  21.  
  22. BOOL
  23. SaveChanges(struct Window *Parent)
  24. {
  25.     return((BOOL)ShowRequest(Parent,LocaleString(MSG_SAVE_CHANGES),LocaleString(MSG_GLOBAL_YES_NO_TXT)));
  26. }
  27.  
  28. BOOL
  29. EditConfig(struct Configuration *Config,LONG Type,ULONG Qualifier,struct Window *Window)
  30. {
  31.     STATIC LONG TypeMappings[15][2] =
  32.     {
  33.         GAD_SERIAL_EDIT,        PREF_SERIAL,
  34.         GAD_MODEM_EDIT,            PREF_MODEM,
  35.         GAD_SCREEN_EDIT,        PREF_SCREEN,
  36.         GAD_TERMINAL_EDIT,        PREF_TERMINAL,
  37.         GAD_EMULATION_EDIT,        PREF_EMULATION,
  38.         GAD_CLIPBOARD_EDIT,        PREF_CLIP,
  39.         GAD_CAPTURE_EDIT,        PREF_CAPTURE,
  40.         GAD_COMMAND_EDIT,        PREF_COMMAND,
  41.         GAD_MISC_EDIT,            PREF_MISC,
  42.         GAD_PATH_EDIT,            PREF_PATH,
  43.         GAD_TRANSFER_EDIT,        PREF_TRANSFER,
  44.         GAD_TRANSLATION_EDIT,    PREF_TRANSLATIONFILENAME,
  45.         GAD_MACRO_EDIT,            PREF_MACROFILENAME,
  46.         GAD_CURSOR_EDIT,        PREF_CURSORFILENAME,
  47.         GAD_FASTMACRO_EDIT,        PREF_FASTMACROFILENAME
  48.     };
  49.  
  50.     struct FileRequester    *FileRequest;
  51.     UBYTE                     DummyBuffer[MAX_FILENAME_LENGTH];
  52.     BOOL                     Changed    = FALSE,
  53.                              FallBack    = TRUE;
  54.     LONG                     PrefType;
  55.     LONG                     i;
  56.     APTR                     Data;
  57.  
  58.         /* Find the prefs fragment that should be worked upon */
  59.  
  60.     for(i = 0 ; i < sizeof(TypeMappings) / (sizeof(LONG) * 2) ; i++)
  61.     {
  62.         if(TypeMappings[i][0] == Type)
  63.         {
  64.             PrefType = TypeMappings[i][1];
  65.  
  66.             break;
  67.         }
  68.     }
  69.  
  70.     Data = GetConfigEntry(Config,PrefType);
  71.  
  72.     if(CreateConfigEntry(Config,PrefType))
  73.     {
  74.         switch(Type)
  75.         {
  76.             case GAD_SERIAL_EDIT:
  77.  
  78.                 Changed = SerialPanel(Window,Config);
  79.                 break;
  80.  
  81.             case GAD_MODEM_EDIT:
  82.  
  83.                 Changed = ModemPanel(Window,Config);
  84.                 break;
  85.  
  86.             case GAD_SCREEN_EDIT:
  87.  
  88.                 Changed = ScreenPanel(Window,Config);
  89.                 break;
  90.  
  91.             case GAD_TERMINAL_EDIT:
  92.  
  93.                 Changed = TerminalPanel(Window,Config);
  94.                 break;
  95.  
  96.             case GAD_EMULATION_EDIT:
  97.  
  98.                 Changed = EmulationPanel(Window,Config);
  99.                 break;
  100.  
  101.             case GAD_CLIPBOARD_EDIT:
  102.  
  103.                 Changed = ClipPanel(Window,Config);
  104.                 break;
  105.  
  106.             case GAD_CAPTURE_EDIT:
  107.  
  108.                 Changed = CapturePanel(Window,Config);
  109.                 break;
  110.  
  111.             case GAD_COMMAND_EDIT:
  112.  
  113.                 Changed = CommandPanel(Window,Config);
  114.                 break;
  115.  
  116.             case GAD_MISC_EDIT:
  117.  
  118.                 Changed = MiscPanel(Window,Config);
  119.                 break;
  120.  
  121.             case GAD_PATH_EDIT:
  122.  
  123.                 Changed = PathPanel(Window,Config);
  124.                 break;
  125.  
  126.             case GAD_TRANSFER_EDIT:
  127.  
  128.                 Changed = LibPanel(Window,Config);
  129.                 break;
  130.  
  131.             case GAD_TRANSLATION_EDIT:
  132.  
  133.                 if(!(Qualifier & SHIFT_KEY))
  134.                 {
  135.                     struct TranslationEntry **Send,**Receive = NULL;
  136.                     BOOL            Success = FALSE;
  137.  
  138.                     strcpy(DummyBuffer,Config->TranslationFileName);
  139.  
  140.                     if(Send = AllocTranslationTable())
  141.                     {
  142.                         if(Receive = AllocTranslationTable())
  143.                         {
  144.                             Success = TRUE;
  145.  
  146.                             if(DummyBuffer[0])
  147.                             {
  148.                                 if(!LoadTranslationTables(DummyBuffer,Send,Receive))
  149.                                 {
  150.                                     LONG Error = IoErr();
  151.  
  152.                                     if(Error != ERROR_OBJECT_NOT_FOUND)
  153.                                         ShowError(Window,ERR_LOAD_ERROR,Error,DummyBuffer);
  154.  
  155.                                     FillTranslationTable(Send);
  156.                                     FillTranslationTable(Receive);
  157.                                 }
  158.                             }
  159.                             else
  160.                             {
  161.                                 FillTranslationTable(Send);
  162.                                 FillTranslationTable(Receive);
  163.                             }
  164.                         }
  165.                     }
  166.  
  167.                     if(Success)
  168.                     {
  169.                         if(TranslationPanelConfig(NULL,&Send,&Receive,DummyBuffer,Window,NULL))
  170.                         {
  171.                             if(Send || Receive)
  172.                             {
  173.                                 if(IsStandardTable(Send) && IsStandardTable(Receive))
  174.                                     DummyBuffer[0] = 0;
  175.  
  176.                                 if(DummyBuffer[0])
  177.                                 {
  178.                                     if(SaveChanges(Window))
  179.                                     {
  180.                                         if(!SaveTranslationTables(DummyBuffer,Send,Receive))
  181.                                             ShowError(Window,ERR_SAVE_ERROR,IoErr(),DummyBuffer);
  182.                                     }
  183.                                 }
  184.                             }
  185.                             else
  186.                                 DummyBuffer[0] = 0;
  187.                         }
  188.  
  189.                         if(strcmp(Config->TranslationFileName,DummyBuffer))
  190.                         {
  191.                             strcpy(Config->TranslationFileName,DummyBuffer);
  192.  
  193.                             Changed = TRUE;
  194.                         }
  195.  
  196.                         FallBack = FALSE;
  197.                     }
  198.  
  199.                     if(Send)
  200.                         FreeTranslationTable(Send);
  201.  
  202.                     if(Receive)
  203.                         FreeTranslationTable(Receive);
  204.                 }
  205.  
  206.                 if(FallBack)
  207.                 {
  208.                     strcpy(DummyBuffer,Config->TranslationFileName);
  209.  
  210.                     if(FileRequest = OpenSingleFile(Window,LocaleString(MSG_PHONEPANEL_SELECT_TRANSLATION_TXT),LocaleString(MSG_GLOBAL_SELECT_TXT),"#?.prefs",DummyBuffer,sizeof(DummyBuffer)))
  211.                     {
  212.                         FreeAslRequest(FileRequest);
  213.  
  214.                         strcpy(Config->TranslationFileName,DummyBuffer);
  215.  
  216.                         Changed = TRUE;
  217.                     }
  218.                 }
  219.  
  220.                 break;
  221.  
  222.             case GAD_MACRO_EDIT:
  223.  
  224.                 if(!(Qualifier & SHIFT_KEY))
  225.                 {
  226.                     struct MacroKeys *Keys;
  227.  
  228.                     if(Keys = (struct MacroKeys *)AllocVecPooled(sizeof(struct MacroKeys),MEMF_ANY | MEMF_CLEAR))
  229.                     {
  230.                         strcpy(DummyBuffer,Config->MacroFileName);
  231.  
  232.                         if(DummyBuffer[0])
  233.                         {
  234.                             if(!LoadMacros(DummyBuffer,Keys))
  235.                             {
  236.                                 LONG Error = IoErr();
  237.  
  238.                                 if(Error != ERROR_OBJECT_NOT_FOUND)
  239.                                     ShowError(Window,ERR_LOAD_ERROR,Error,DummyBuffer);
  240.                             }
  241.                         }
  242.  
  243.                         if(MacroPanelConfig(NULL,Keys,DummyBuffer,Window,NULL))
  244.                         {
  245.                             if(DummyBuffer[0] && SaveChanges(Window))
  246.                             {
  247.                                 if(!WriteIFFData(DummyBuffer,Keys,sizeof(struct MacroKeys),ID_KEYS))
  248.                                     ShowError(Window,ERR_SAVE_ERROR,IoErr(),DummyBuffer);
  249.                             }
  250.                         }
  251.  
  252.                         if(strcmp(Config->MacroFileName,DummyBuffer))
  253.                         {
  254.                             strcpy(Config->MacroFileName,DummyBuffer);
  255.  
  256.                             Changed = TRUE;
  257.                         }
  258.  
  259.                         FallBack = FALSE;
  260.  
  261.                         FreeVecPooled(Keys);
  262.                     }
  263.                 }
  264.  
  265.                 if(FallBack)
  266.                 {
  267.                     strcpy(DummyBuffer,Config->MacroFileName);
  268.  
  269.                     if(FileRequest = OpenSingleFile(Window,LocaleString(MSG_PHONEPANEL_SELECT_KEYBOARD_MACROS_TXT),LocaleString(MSG_GLOBAL_SELECT_TXT),"#?.prefs",DummyBuffer,sizeof(DummyBuffer)))
  270.                     {
  271.                         FreeAslRequest(FileRequest);
  272.  
  273.                         strcpy(Config->MacroFileName,DummyBuffer);
  274.  
  275.                         Changed = TRUE;
  276.                     }
  277.                 }
  278.  
  279.                 break;
  280.  
  281.             case GAD_CURSOR_EDIT:
  282.  
  283.                 if(!(Qualifier & SHIFT_KEY))
  284.                 {
  285.                     struct CursorKeys *Keys;
  286.  
  287.                     if(Keys = (struct CursorKeys *)AllocVecPooled(sizeof(struct CursorKeys),MEMF_ANY | MEMF_CLEAR))
  288.                     {
  289.                         strcpy(DummyBuffer,Config->CursorFileName);
  290.  
  291.                         if(DummyBuffer[0])
  292.                         {
  293.                             if(!ReadIFFData(DummyBuffer,Keys,sizeof(struct CursorKeys),ID_KEYS))
  294.                             {
  295.                                 LONG Error = IoErr();
  296.  
  297.                                 ResetCursorKeys(Keys);
  298.  
  299.                                 if(Error != ERROR_OBJECT_NOT_FOUND)
  300.                                     ShowError(Window,ERR_LOAD_ERROR,Error,DummyBuffer);
  301.                             }
  302.                         }
  303.                         else
  304.                             ResetCursorKeys(Keys);
  305.  
  306.                         if(CursorPanelConfig(NULL,Keys,DummyBuffer,Window,NULL))
  307.                         {
  308.                             if(DummyBuffer[0] && SaveChanges(Window))
  309.                             {
  310.                                 if(!WriteIFFData(DummyBuffer,Keys,sizeof(struct CursorKeys),ID_KEYS))
  311.                                     ShowError(Window,ERR_SAVE_ERROR,IoErr(),DummyBuffer);
  312.                             }
  313.                         }
  314.  
  315.                         if(strcmp(Config->CursorFileName,DummyBuffer))
  316.                         {
  317.                             strcpy(Config->CursorFileName,DummyBuffer);
  318.  
  319.                             Changed = TRUE;
  320.                         }
  321.  
  322.                         FallBack = FALSE;
  323.  
  324.                         FreeVecPooled(Keys);
  325.                     }
  326.                 }
  327.  
  328.                 if(FallBack)
  329.                 {
  330.                     strcpy(DummyBuffer,Config->CursorFileName);
  331.  
  332.                     if(FileRequest = OpenSingleFile(Window,LocaleString(MSG_PHONEPANEL_SELECT_CURSOR_KEYS_TXT),LocaleString(MSG_GLOBAL_SELECT_TXT),"#?.prefs",DummyBuffer,sizeof(DummyBuffer)))
  333.                     {
  334.                         FreeAslRequest(FileRequest);
  335.  
  336.                         strcpy(Config->CursorFileName,DummyBuffer);
  337.  
  338.                         Changed = TRUE;
  339.                     }
  340.                 }
  341.  
  342.                 break;
  343.  
  344.             case GAD_FASTMACRO_EDIT:
  345.  
  346.                 if(!(Qualifier & SHIFT_KEY))
  347.                 {
  348.                     struct List *List;
  349.  
  350.                     if(List = CreateList())
  351.                     {
  352.                         strcpy(DummyBuffer,Config->FastMacroFileName);
  353.  
  354.                         if(DummyBuffer[0])
  355.                         {
  356.                             if(!LoadFastMacros(DummyBuffer,List))
  357.                             {
  358.                                 LONG Error = IoErr();
  359.  
  360.                                 if(Error != ERROR_OBJECT_NOT_FOUND)
  361.                                     ShowError(Window,ERR_LOAD_ERROR,Error,DummyBuffer);
  362.                             }
  363.                         }
  364.  
  365.                         if(FastMacroPanelConfig(NULL,List,DummyBuffer,Window,NULL))
  366.                         {
  367.                             if(DummyBuffer[0] && SaveChanges(Window))
  368.                             {
  369.                                 if(!SaveFastMacros(DummyBuffer,List))
  370.                                     ShowError(Window,ERR_SAVE_ERROR,IoErr(),DummyBuffer);
  371.                             }
  372.                         }
  373.  
  374.                         if(strcmp(Config->FastMacroFileName,DummyBuffer))
  375.                         {
  376.                             strcpy(Config->FastMacroFileName,DummyBuffer);
  377.  
  378.                             Changed = TRUE;
  379.                         }
  380.  
  381.                         FallBack = FALSE;
  382.  
  383.                         DeleteList(List);
  384.                     }
  385.                 }
  386.  
  387.                 if(FallBack)
  388.                 {
  389.                     strcpy(DummyBuffer,Config->FastMacroFileName);
  390.  
  391.                     if(FileRequest = OpenSingleFile(Window,LocaleString(MSG_PHONEPANEL_SELECT_FAST_MACROS_TXT),LocaleString(MSG_GLOBAL_SELECT_TXT),"#?.prefs",DummyBuffer,sizeof(DummyBuffer)))
  392.                     {
  393.                         FreeAslRequest(FileRequest);
  394.  
  395.                         strcpy(Config->FastMacroFileName,DummyBuffer);
  396.  
  397.                         Changed = TRUE;
  398.                     }
  399.                 }
  400.  
  401.                 break;
  402.         }
  403.  
  404.         if(!Changed && !Data)
  405.             DeleteConfigEntry(Config,PrefType);
  406.     }
  407.     else
  408.         DisplayBeep(Window->WScreen);
  409.  
  410.     return(Changed);
  411. }
  412.  
  413. BOOL
  414. ChangeState(LONG Type,LONG Default,struct PhoneNode *Node)
  415. {
  416.     STATIC LONG TypeMappings[][2] =
  417.     {
  418.         GAD_SERIAL_STATE,        PREF_SERIAL,
  419.         GAD_MODEM_STATE,        PREF_MODEM,
  420.         GAD_SCREEN_STATE,        PREF_SCREEN,
  421.         GAD_TERMINAL_STATE,        PREF_TERMINAL,
  422.         GAD_EMULATION_STATE,    PREF_EMULATION,
  423.         GAD_CLIPBOARD_STATE,    PREF_CLIP,
  424.         GAD_CAPTURE_STATE,        PREF_CAPTURE,
  425.         GAD_COMMAND_STATE,        PREF_COMMAND,
  426.         GAD_MISC_STATE,            PREF_MISC,
  427.         GAD_PATH_STATE,            PREF_PATH,
  428.         GAD_TRANSFER_STATE,        PREF_TRANSFER,
  429.         GAD_TRANSLATION_STATE,    PREF_TRANSLATIONFILENAME,
  430.         GAD_MACRO_STATE,        PREF_MACROFILENAME,
  431.         GAD_CURSOR_STATE,        PREF_CURSORFILENAME,
  432.         GAD_FASTMACRO_STATE,    PREF_FASTMACROFILENAME,
  433.         GAD_RATE_STATE,            PREF_RATES
  434.     };
  435.  
  436.     struct Configuration    *LocalConfig;
  437.     LONG                     PrefType;
  438.     LONG                     i;
  439.     APTR                     Data;
  440.  
  441.         /* Find the prefs fragment that should be worked upon */
  442.  
  443.     for(i = 0 ; i < sizeof(TypeMappings) / (sizeof(LONG) * 2) ; i++)
  444.     {
  445.         if(TypeMappings[i][0] == Type)
  446.         {
  447.             PrefType = TypeMappings[i][1];
  448.  
  449.             break;
  450.         }
  451.     }
  452.  
  453.         /* This is the one we're about to put through the wringer */
  454.  
  455.     LocalConfig = Node->Entry->Config;
  456.  
  457.         /* A special case, the phone rates */
  458.  
  459.     if(PrefType == PREF_RATES)
  460.     {
  461.         if(Default)
  462.         {
  463.                 /* There will be some rates... */
  464.  
  465.             Node->Entry->Header->NoRates = FALSE;
  466.  
  467.                 /* Nothing in this list? */
  468.  
  469.             if(IsListEmpty((struct List *)&Node->Entry->TimeDateList))
  470.             {
  471.                 struct TimeDateNode *TimeDateNode;
  472.  
  473.                     /* Provide defaults */
  474.  
  475.                 if(TimeDateNode = CreateTimeDateNode(-1,-1,"",2))
  476.                     AddTail((struct List *)&Node->Entry->TimeDateList,&TimeDateNode->Node);
  477.                 else
  478.                 {
  479.                     Node->Entry->Header->NoRates = TRUE;    /* Sorry, guv'nor */
  480.  
  481.                     return(FALSE);
  482.                 }
  483.             }
  484.         }
  485.         else
  486.         {
  487.                 /* Discard the time/date list */
  488.  
  489.             FreeTimeDateList((struct List *)&Node->Entry->TimeDateList);
  490.  
  491.                 /* No rates here */
  492.  
  493.             Node->Entry->Header->NoRates = TRUE;
  494.         }
  495.  
  496.         return(TRUE);
  497.     }
  498.  
  499.         /* Get a pointer to it */
  500.  
  501.     Data = GetConfigEntry(LocalConfig,PrefType);
  502.  
  503.         /* Default == TRUE means: replace fragment with a copy of the */
  504.         /*                        current global configuration which the */
  505.         /*                        user can edit later. Making a connection */
  506.         /*                        through the phonebook will cause the */
  507.         /*                        global configuration to be replaced */
  508.         /*                        with this copy. */
  509.  
  510.     if(Default)
  511.     {
  512.         BOOL Result;
  513.  
  514.             /* Get rid of the old stuff */
  515.  
  516.         if(Data)
  517.         {
  518.             DeleteConfigEntry(LocalConfig,PrefType);
  519.  
  520.             Result = TRUE;
  521.         }
  522.         else
  523.             Result = FALSE;
  524.  
  525.             /* Create a new fragment with default values */
  526.  
  527.         if(!CreateConfigEntry(LocalConfig,PrefType))
  528.             return(Result);
  529.     }
  530.     else
  531.     {
  532.             /* Default == FALSE means: discard this fragment; making a */
  533.             /*                         connection through the phonebook */
  534.             /*                         will then leave these main config */
  535.             /*                         fragments unmodified. */
  536.  
  537.         if(Data)
  538.             DeleteConfigEntry(LocalConfig,PrefType);
  539.         else
  540.             return(FALSE);
  541.     }
  542.  
  543.     return(TRUE);
  544. }
  545.  
  546. STRPTR *
  547. BuildLabels(PhonebookHandle *PhoneHandle)
  548. {
  549.     STRPTR *Labels;
  550.  
  551.     if(Labels = (STRPTR *)AllocVecPooled(sizeof(STRPTR) * (GetListSize((struct List *)&PhoneHandle->PhoneGroupList) + 2),MEMF_ANY))
  552.     {
  553.         struct Node *Node;
  554.         STRPTR *Index;
  555.  
  556.         Index = Labels;
  557.  
  558.         *Index++ = LocaleString(MSG_PHONEBOOK_ALL_GROUP_TXT);
  559.  
  560.         for(Node = (struct Node *)PhoneHandle->PhoneGroupList.mlh_Head ; Node->ln_Succ ; Node = Node->ln_Succ)
  561.             *Index++ = Node->ln_Name;
  562.  
  563.         *Index = NULL;
  564.     }
  565.  
  566.     return(Labels);
  567. }
  568.  
  569. VOID
  570. FindGroup(struct List *List,LONG *GroupIndex,LONG *NodeIndex,PhoneNode *Wanted)
  571. {
  572.     PhoneGroupNode    *GroupNode;
  573.     PhoneNode        *Node;
  574.     LONG             Index;
  575.     ULONG             Group;
  576.  
  577.     for(Group = 0, GroupNode = (PhoneGroupNode *)List->lh_Head ; GroupNode->Node.ln_Succ ; GroupNode = (PhoneGroupNode *)GroupNode->Node.ln_Succ, Group++)
  578.     {
  579.         for(Index = 0, Node = (struct PhoneNode *)GroupNode->GroupList.mlh_Head ; Node->Node.ln_Succ ; Node = (struct PhoneNode *)Node->Node.ln_Succ, Index++)
  580.         {
  581.             if(Node == Wanted)
  582.             {
  583.                 *GroupIndex    = Group + 1;
  584.                 *NodeIndex    = Index;
  585.  
  586.                 break;
  587.             }
  588.         }
  589.     }
  590. }
  591.